/* 服务器 */
//引入模块
const express = require("express");
const cors = require("cors");
const socketIo = require("socket.io");
//引入body-parser中间件
const bodyParser = require("body-parser");
// 引入连接池
const pool = require("./pool.js");
// 引入路由
const userRouter = require("./routers/user.js");
// web客户端端口号
const webPort = 7000;
// socket服务端端口号
const socketPort = 7777;
//创建web服务器
const app = express();
//应用body-parser中间件
app.use(
  bodyParser.urlencoded({
    extended: false, //使用querystring解析查询字符串为对象
  })
);
//解决vue的post请求无法接收参数问题
app.use(bodyParser.json());
// 解决跨越
app.use(cors());
//托管静态资源到public目录下
app.use(express.static("public"));
//监听端口
app.listen(webPort, () => {
  console.log("服务器开启了！");
});
// 引入路由
app.use("/user", userRouter);

// 开启socket服务
let server = app.listen(socketPort);
// socket 初始化
const io = socketIo(server, { cors: true });

// 登录用户信息
var users = [];
// 获取登录索引  userInfo:需判断的用户信息{}  return: 索引/-1
function getIndex(userInfo) {
  // 默认未找到
  var res = -1;
  if (users.length == 0) return res;
  // 保存索引结果
  users.forEach((item, index) => {
    if (item.id == userInfo.id) {
      res = index;
    }
  });
  return res;
}

io.on("connection", (socket) => {
  // 登录
  socket.on("login", function (params) {
    var Index = getIndex(params);
    if (Index !== -1) {
      // 用户已登录--> 断开前一个连接，连接新连接
      // 前一个连接的wsId
      var beforeId = users[Index].wsId;
      socket.to(beforeId).emit("repeat_login", "账号在其他设备登录,请重新登录");
      users.push(params);
    } else {
      // 用户未登录-->添加新用户
      users.push(params);
      // 除自己外的所有人接收
      socket.broadcast.emit("login_tips", params);
      // 所有人接收登录用户
      io.emit("login_msg", users);
    }
  });
  // 转发信息
  socket.on("send", function (params) {
    socket.emit("send_msg", {
      msg: params.msg,
    });
    socket.broadcast.emit("send_msg", params);
  });
  // 修改昵称
  socket.on("nickname", function (params) {
    var $id = params.id;
    var $nickname = params.nickname;
    var sql = "UPDATE user SET nickname=? WHERE id=?";
    pool.query(sql, [$nickname, $id], function (err, result) {
      if (err) throw err; //抛出异常
      if (result.affectedRows > 0) {
        // 修改成功
        var Index = getIndex(params);
        users[Index].nickname = $nickname;
        io.emit("nickname_msg", {
          code: 1,
          user: params,
        });
      } else {
        //修改失败
        socket.emit("nickname_msg", {
          code: 0,
        });
      }
    });
  });
  // 退出
  socket.on("disconnect", function () {
    // 当前wsId
    var wsId = socket.id;
    // 保存当前用户信息
    var nowInfo = {};
    users.forEach((item, index) => {
      if (item.wsId === wsId) {
        nowInfo.info = item;
        nowInfo.index = index;
      }
    });
    // 判断为重复登录退出还是正常退出
    var Index = getIndex(nowInfo.info);
    if (Index === -1) {
      // 重复登录退出
      users.splice(nowInfo.index, 1);
    } else {
      // 正常退出
      users.splice(nowInfo.index, 1);
      io.emit("logout", nowInfo.info);
    }
  });
});
